package utils

import (
	"gorm.io/gorm"
)

const (
	DB_CACHE_PREFIX = "db:"
)

func GetData(target any) bool {
	err := Db.Where(target).First(target).Error
	if err != nil {
		// logx.Errorf("GetData is error:%s", err)
		return false
	}
	return true
}

func GetDataById(id uint, target any) bool {
	err := Db.First(target, id).Error
	if err != nil {
		// logx.Errorf("GetData is error:%s", err)
		return false
	}
	return true
}

func TxData(tx *gorm.DB, target any) error {
	err := tx.Find(target).Error
	if err != nil {
		// logx.Error("TxData is error:", err)
		return err
	}
	return nil
}

func TxFind(tx *gorm.DB, target any) error {
	err := tx.Find(target).Error
	if err != nil {
		// logx.Error("TxFind is error:", err)
		return err
	}
	return nil
}

func TxCount(tx *gorm.DB) int64 {
	var total int64
	err := tx.Count(&total).Error
	if err != nil {
		// logx.Error("TxCount is error:", err)
		return 0
	}
	return total
}

func TxPage(tx *gorm.DB, page int, target any) error {
	return TxPageSize(tx, page, 20, target)
}

func TxPageSize(tx *gorm.DB, page int, pageSize int, target any) error {
	offset := (page - 1) * pageSize
	err := tx.Offset(offset).Limit(pageSize).Find(target).Error
	if err != nil {
		// logx.Error("TxPage is error:", err)
		return err
	}
	return nil
}

// 使用map 更新map的所有列，使用struct会忽略零值
func UpdateById(id uint, data any) error {
	err := Db.Where("id = ?", id).Updates(data).Error
	return err
}

// 使用map 更新map的所有列，使用struct会忽略零值
func UpdateByIdCols(id uint, data any, cols string) error {
	err := Db.Where("id = ?", id).Select(cols).Updates(data).Error
	return err
}

// 使用map 更新map的所有列，使用struct会忽略零值
func Update(target any, where map[string]any) error {
	err := Db.Where(where).Updates(target).Error
	return err
}

// 使用map 更新map的所有列，使用struct会忽略零值
func UpdateCols(target map[string]any, where map[string]any) error {
	err := Db.Where(where).Updates(target).Error
	return err
}

func InsertData(data any) error {
	err := Db.Create(data).Error
	return err
}

func TxDelete(tx *gorm.DB, target any) error {
	err := tx.Delete(target).Error
	return err
}
func DeleteData(target any) error {
	err := Db.Delete(target).Error
	return err
}

func DeleteDataById(id uint, target any) error {
	err := Db.Delete(target, id).Error
	return err
}
